package com.tyam.bean;

import java.io.Serializable;
import java.math.BigDecimal;
import java.util.Collection;
import java.util.Date;

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;
import javax.persistence.OneToMany;
import javax.persistence.Temporal;
import javax.persistence.TemporalType;

import org.hibernate.annotations.Cascade;
import org.hibernate.annotations.CascadeType;
import org.hibernate.annotations.Fetch;
import org.hibernate.annotations.FetchMode;

import com.tyam.bean.Empresa;

@Entity
public class Nota implements Serializable {
	
	private static final long serialVersionUID = 1L;
	
	@Id
	@GeneratedValue (strategy = GenerationType.AUTO)
	private int codigoNota;
	
	@ManyToOne(fetch = FetchType.EAGER)
	@JoinColumn(name = "codigoEmpresa", insertable = true, updatable = true)
	@Fetch(FetchMode.JOIN)
	@Cascade(CascadeType.SAVE_UPDATE)
	private Empresa empresa;	
	
	@ManyToOne(fetch = FetchType.EAGER)
	@JoinColumn(name = "codigoContribuinteTomador", insertable = true, updatable = true)
	@Fetch(FetchMode.JOIN)
	@Cascade(CascadeType.SAVE_UPDATE)
	private Contribuinte contribuinteTomador;
	
	@ManyToOne(fetch = FetchType.EAGER)
	@JoinColumn(name = "codigoContribuintePrestador", insertable = true, updatable = true)
	@Fetch(FetchMode.JOIN)
	@Cascade(CascadeType.SAVE_UPDATE)
	private Contribuinte contribuintePrestador;	
	
	
	@Temporal(TemporalType.DATE)
	private Date dataEmissao;
	
	@ManyToOne(fetch = FetchType.EAGER)
	@JoinColumn(name = "codigoReceita", insertable = true, updatable = true)
	@Fetch(FetchMode.JOIN)
	@Cascade(CascadeType.SAVE_UPDATE)
	private Receita receita;
	
	@Column(precision=12, scale=2, nullable=false)
	private BigDecimal valorBruto;
	
	@Column(precision=12, scale=2, nullable=false)
	private BigDecimal valorISS;
	
	@Column(precision=12, scale=2, nullable=false)
	private BigDecimal valorLiquido;
	
	@Column(length=1)
	private String status;
	
	private boolean descontaISS;	
	
	@OneToMany(mappedBy="nota", fetch = FetchType.EAGER)
	@Cascade({CascadeType.ALL,CascadeType.DELETE_ORPHAN})	
	private Collection<NotaItens> notaItens;
	
	public Nota(){
		
	}

	public int getCodigoNota() {
		return codigoNota;
	}

	public void setCodigoNota(int codigoNota) {
		this.codigoNota = codigoNota;
	}

	public Empresa getEmpresa() {
		return empresa;
	}

	public void setEmpresa(Empresa empresa) {
		this.empresa = empresa;
	}


	public Date getDataEmissao() {
		return dataEmissao;
	}

	public void setDataEmissao(Date dataEmissao) {
		this.dataEmissao = dataEmissao;
	}

	public Receita getReceita() {
		return receita;
	}

	public void setReceita(Receita receita) {
		this.receita = receita;
	}

	public BigDecimal getValorBruto() {
		return valorBruto;
	}

	public void setValorBruto(BigDecimal valorBruto) {
		this.valorBruto = valorBruto;
	}

	public BigDecimal getValorISS() {
		return valorISS;
	}

	public void setValorISS(BigDecimal valorISS) {
		this.valorISS = valorISS;
	}

	public BigDecimal getValorLiquido() {
		return valorLiquido;
	}

	public void setValorLiquido(BigDecimal valorLiquido) {
		this.valorLiquido = valorLiquido;
	}

	public String getStatus() {
		return status;
	}

	public void setStatus(String status) {
		this.status = status;
	}

	public boolean isDescontaISS() {
		return descontaISS;
	}

	public void setDescontaISS(boolean descontaISS) {
		this.descontaISS = descontaISS;
	}

	public Collection<NotaItens> getNotaItens() {
		return notaItens;
	}

	public void setNotaItens(Collection<NotaItens> notaItens) {
		this.notaItens = notaItens;
	}

	@Override
	public int hashCode() {
		final int prime = 31;
		int result = 1;
		result = prime * result + codigoNota;
		return result;
	}

	@Override
	public boolean equals(Object obj) {
		if (this == obj)
			return true;
		if (obj == null)
			return false;
		if (getClass() != obj.getClass())
			return false;
		Nota other = (Nota) obj;
		if (codigoNota != other.codigoNota)
			return false;
		return true;
	}

	public Contribuinte getContribuinteTomador() {
		return contribuinteTomador;
	}

	public void setContribuinteTomador(Contribuinte contribuinteTomador) {
		this.contribuinteTomador = contribuinteTomador;
	}

	public Contribuinte getContribuintePrestador() {
		return contribuintePrestador;
	}

	public void setContribuintePrestador(Contribuinte contribuintePrestador) {
		this.contribuintePrestador = contribuintePrestador;
	}

}
